home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / eplain / btxmac.tex < prev    next >
Text File  |  1993-03-14  |  34KB  |  848 lines

  1. %% @texfile{
  2. %%   author = "Karl Berry and Oren Patashnik",
  3. %%   version = "0.99j",
  4. %%   date = "14 Mar 1992",
  5. %%   filename = "btxmac.tex",
  6. %%   address = "Please use electronic mail",
  7. %%   checksum = "834    4503   33061",
  8. %%   email = "opbibtex@cs.stanford.edu",
  9. %%   codetable = "ISO/ASCII",
  10. %%   supported = "yes",
  11. %%   docstring = "Defines macros that make BibTeX work with plain TeX",
  12. %% }
  13. % BibTeX-for-TeX macros, version 0.99j, for BibTeX 0.99c, TeX 3.0 or later.
  14. % Copyright (C) 1990--92 by Karl Berry and Oren Patashnik; all rights reserved.
  15. % You may copy this file provided: that it's accompanied by the
  16. % "BibTeXing" document, whose text is contained in the file `btxdoc.tex';
  17. % that any documentation you write for these macros also gives a
  18. % reference for "BibTeXing"; and that either you make absolutely no
  19. % changes to your copy, or if you do make changes, (1) you name the file
  20. % something other than `btxmac.tex' and you remove all occurrences of
  21. % `btxmac.tex' from the file, (2) you put, somewhere in the first twenty
  22. % lines of the file, your name, along with an electronic address at which
  23. % others who might use the file may reach you, and (3) you remove each
  24. % occurrence of Oren's name and electronic address from this file.  These
  25. % restrictions help ensure that all standard versions of these macros are
  26. % identical, and that Oren doesn't get deluged with inappropriate e-mail.
  27. %
  28. % This file, btxmac.tex, contains TeX macros that allow BibTeX, a
  29. % bibliography program that was originally designed for use with LaTeX,
  30. % to work with plain TeX.  Please report any bugs (outright goofs,
  31. % improvable macros, misfeatures, or unclear documentation) to Oren
  32. % Patashnik (opbibtex@cs.stanford.edu).  These macros will become frozen
  33. % shortly after BibTeX version 1.00 is released.
  34. %
  35. % AMS-TEX WARNING: We tried very hard, for version .99i of these macros,
  36. % to make them compatible with AmS-TeX.  We succeeded to the extent
  37. % that, if you use one of the standard bibliography styles, you probably
  38. % won't notice any problems with version 0.99i of btxmac.tex.  But
  39. % ultimately we failed, in that the inherent incompatibilities between
  40. % plain TeX and AmS-TeX kept making these macros break, for certain
  41. % inputs or certain styles.  Examples:  (1) AmS-TeX treats at-signs as
  42. % special, in ways that plain TeX and LaTeX don't, so that, for example,
  43. % you can't have any `@' characters in an argument to the \cite command,
  44. % the way you can in TeX or LaTeX; (2) AmS-TeX decided that plain TeX's
  45. % and LaTeX's macron-accent control sequence `\=' should be undefined;
  46. % so you'll need to define `\=' to be `\B' to get the xampl.bib example
  47. % suggested below to work with AmS-TeX; (3) AmS-TeX redefines the tie
  48. % character `~' of plain TeX, and AmS-TeX's `amsppt' style redefines
  49. % plain TeX's `\nobreak' macro, so that if you use an author-date style
  50. % like `apalike' and you have a multiple-author reference for which the
  51. % author-date style automatically produces a citation in the text like
  52. % `(Jones et~al., 1992)' you will throw AmS-TeX's `amsppt' style into
  53. % an infinite loop, exceeding its input stack size.  In practice, such
  54. % incompatibilities surface infrequently; but it is now clear to us that
  55. % it's not worth the effort (perhaps it's not even possible) to make the
  56. % btxmac.tex macros robust when used both with plain TeX and Ams-TeX.
  57. % If the BibTeX/AmS-TeX results attainable with the current btxmac.tex
  58. % macros are sufficient, fine.  But if there's a demand for more robust
  59. % BibTeX/AmS-TeX behavior, then someone who's very familiar with the
  60. % AmS-TeX package should probably make an amsbtxmc.tex version of the
  61. % macros (remembering to follow the copyright restrictions above).
  62. % Until then, if you're an AmS-TeX user, or a LaTeX or plain TeX user
  63. % sharing files with an AmS-TeX user, beware.
  64. % END OF AMS-TEX WARNING.
  65. %
  66. % To use these macros you should be familiar with how BibTeX interacts
  67. % with LaTeX, since BibTeX's interaction with TeX is very similar; that
  68. % interaction is explained in the LaTeX manual.  It also helps to
  69. % have read "BibTeXing", the documentation that accompanies BibTeX.
  70. % Then, if you want, you should redefine any of the macros that begin
  71. % with `\bbl' or `\biblabel' or `\print' that you need to get formatting
  72. % different from the default (the default settings are designed to
  73. % accompany a bibliography style like BibTeX's standard style `plain').
  74. % The macros you might want to change are described briefly a few
  75. % paragraphs hence.  [To get started without reading any documentation,
  76. % try running the nine-line .tex file below through TeX and BibTeX.
  77. % Remember the general scheme: Running (La)TeX writes information on
  78. % the .aux (auxiliary) file; then running BibTeX reads information from
  79. % the .aux, .bst (style), and .bib (database) files, and writes
  80. % information (the bibliography) on a .bbl file; then running (La)TeX
  81. % incorporates the bibliography; then running (La)TeX once more fixes
  82. % the remaining forward references into the bibliography.  Thus, to get
  83. % everything incorporated into your output, you'll have to run (La)TeX,
  84. % BibTeX, (La)TeX, (La)TeX.  (Standup, sitdown, fight, fight, fight.)]
  85. %
  86. % These macros can stand alone or they can be \input into a macro
  87. % package, like Eplain, that is sufficiently compatible with plain TeX.
  88. % To use these macros to format the 0.99 version of the xampl.bib file
  89. % that's distributed with BibTeX (that version of the file has no
  90. % self-identification), you'll need to define \mbox, which is a LaTeX
  91. % command, to be \hbox, as in the example below.
  92. %
  93. % Here's a nine-line plain TeX file for trying out btxmac.tex; of course
  94. % you'll have to remove the comment characters at the beginning of each
  95. % line, and, depending on your system, you might have to take steps so
  96. % that BibTeX can "see" the files xampl.bib and plain.bst (BibTeX will
  97. % give you two empty-field warning messages that you should ignore).
  98. %
  99. %     \def\mbox#1{\leavevmode\hbox{#1}}
  100. %     \input btxmac
  101. %     \noindent This cites Aamport's gnominious article~\cite{article-full}.
  102. %     \medskip
  103. %     \leftline{\bf References}
  104. %     \nocite{*}   % put all database entries into the reference list
  105. %     \bibliography{xampl}   % specify the database files; here, just xampl.bib
  106. %     \bibliographystyle{plain}   % specify plain.bst as the style file
  107. %     \bye
  108. %
  109. %
  110. %   HISTORY
  111. %
  112. % Karl Berry wrote the original version of these macros in 1989 and
  113. % 1990, for use in his `Eplain' package.  Oren Patashnik modified them
  114. % slightly in July 1990, as part of the official BibTeX distribution.
  115. %
  116. %    1-Aug-90  Version 0.99a, not released to the general public.
  117. %   14-Aug-90  0.99b, first general release.
  118. %   26-Aug-90  0.99c, made \@undefinedmessage work with other macro packages.
  119. %    6-Sep-90  0.99d, allowed for general formatting of bibliography labels,
  120. %                     for general formatting of (in-text) citations, and for
  121. %                     changing certain catcodes while reading the .aux file.
  122. %   14-Nov-90  0.99e, changed the way \@setletters works, made some \new...'s
  123. %                     non-outer, and changed the way Eplain reads this file.
  124. %   12-Dec-90  0.99f, made \@resetnumerals change the `,' and `.' catcodes; and
  125. %                     added \biblabelextrahang, \@getoptionalarg, and \bblsc.
  126. %   11-Mar-91  0.99g, made a few minor changes required by the way Eplain reads
  127. %                     this file, but no functional changes.
  128. %   24-Apr-91  0.99h, inhibited the reading and writing of the .aux file if it
  129. %                     isn't used or if the \noauxfile macro is defined, and
  130. %                     removed some .aux-file-opening detritus; printed the
  131. %                     cite-key of undefined citations in \tt font; changed the
  132. %                     catcode of `_' inside \cite; and called \@resetnumerals
  133. %                     from inside a group.
  134. %   29-Feb-92  0.99i, made these macros semi-compatible with AmS-TeX; removed
  135. %                     \@resetnumerals, \@setletters, \@tokstostring, and
  136. %                     friends; changed the way \cite handles catcodes; changed
  137. %                     \@getoptionalarg, and had \bibitem and \newcommand use
  138. %                     it; added \@futurenonspacelet and (to facilitate the use
  139. %                     of multiple reference lists) \bblfilebasename; changed
  140. %                     \biblabelprint to use the new macros \biblabelprecontents
  141. %                     and \biblabelpostcontents, and to, by default, right-
  142. %                     justify numeric labels; and renamed \biblabelextrahang to
  143. %                     the more descriptive \biblabelextraspace.
  144. %   14-Mar-92  0.99j, made 0.99i's use of `\\' local to btxmac.tex.
  145. %
  146. %
  147. % The LaTeX-related commands defined in this file include (a) the four
  148. % commands that a user types (\bibliography, \bibliographystyle, \cite,
  149. % and \nocite); (b) the three commands that BibTeX looks for in the .aux
  150. % file (\bibdata, \bibstyle, and \citation---there is a fourth command
  151. % that BibTeX looks for, but that command is related to LaTeX's \include
  152. % facility, so these macros ignore that command); and (c) a LaTeX
  153. % command (\newcommand) that's written by one of the four standard
  154. % bibliography styles (alpha).  The definitions here are not exactly the
  155. % same as the corresponding LaTeX definitions (those eight LaTeX
  156. % definitions depend on a significant fraction of LaTeX itself).  But
  157. % the only substantial differences are with \newcommand, which here,
  158. % without complaining, lets you redefine a preexisting control sequence
  159. % (in LaTeX, \newcommand won't let you redefine a preexisting command),
  160. % and which here doesn't make the control sequences it defines \long (in
  161. % LaTeX, that happens automatically); there may also be other minor
  162. % differences.  To summarize: Unless you know what you're doing, you
  163. % shouldn't define any control sequences with these eight names:
  164. %
  165. % \bibdata
  166. % \bibliography
  167. % \bibliographystyle
  168. % \bibstyle
  169. % \citation
  170. % \cite
  171. % \newcommand
  172. % \nocite
  173. %
  174. % There are three other commands written by one or more of the four
  175. % standard (plain, abbrv, alpha, unsrt) or four semistandard (acm,
  176. % apalike, ieeetr, siam) bibliography styles; they take effect only
  177. % within the bibliography, and are redefinable, as explained later:
  178. %
  179. % \em
  180. % \newblock
  181. % \sc
  182. %
  183. % There's one control sequence you might want to use (but not redefine)
  184. % in redefining \biblabelprint:
  185. %
  186. % \biblabelwidth
  187. %
  188. % There are fifteen other control sequences (explained later in more detail)
  189. % that the macros of this file will use if you define them---you should
  190. % define them after the \input btxmac command but before the \bibliography
  191. % command.  The first six begin with `\bbl' and affect fonts, spacing,
  192. % perhaps other characteristics of the bibliography, and which .bbl files
  193. % get read; the next five begin with `\biblabel' and determine how labels
  194. % are formatted in the bibliography; and the last four begin with `\print'
  195. % and determine how the in-text citations are formatted:
  196. %
  197. % \bblem
  198. % \bblfilebasename
  199. % \bblhook
  200. % \bblnewblock
  201. % \bblrm
  202. % \bblsc
  203. % \biblabelcontents
  204. % \biblabelprecontents
  205. % \biblabelprint
  206. % \biblabelpostcontents
  207. % \biblabelextraspace
  208. % \printbetweencitations
  209. % \printcitefinish
  210. % \printcitenote
  211. % \printcitestart
  212. %
  213. % If it's defined before the \input btxmac command, the control sequence
  214. % below inhibits the reading and writing of the .aux file(s), and the
  215. % issuing of related warning messages.  Any definition will do.  This
  216. % feature might help when you're working on draft stages of a document:
  217. %
  218. % \noauxfile
  219. %
  220. %
  221. % Here's another control sequence (it's described later) that you
  222. % probably won't want to redefine unless you are writing another macro
  223. % package; if you do redefine it, however, do it before the \input btxmac
  224. % command (and notice that it has an `@' in its name):
  225. %
  226. % \@undefinedmessage
  227. %
  228. % Any other control sequence in this file that might conflict with
  229. % something you've defined will have an `@' in its name, so such conflicts
  230. % are unlikely; but if you're worried about a specific control sequence
  231. % name, do a text search of this file to look for it.
  232. %
  233. %
  234. % So to start things off we turn `@' into a letter (category code 11),
  235. % keeping track of the old category code for future restoration.
  236. % (Simply resetting it to 12 when we leave these macros is
  237. % insufficient.)  The use of `\cite' as a temporary control sequence is
  238. % a kludge, but it's a reasonably simple way to accomplish what we need
  239. % without possibly overwriting something (without an `@' in its name)
  240. % that might already be defined.
  241. %
  242. \edef\cite{\the\catcode`@}%
  243. \catcode`@ = 11
  244. \let\@oldatcatcode = \cite
  245. \chardef\@letter = 11
  246. \chardef\@other = 12
  247. %
  248. %
  249. % Next come some things that will be useful later.
  250. %
  251. % Make an outer definition into an inner one (due to Chris Thompson).
  252. % The arguments should be the control sequence to be defined, and the
  253. % new of the \outer control sequence, as characters; the control
  254. % sequence #1 is defined to be just the same as \csname#2\endcsname, but
  255. % not \outer.  For example, \@innerdef\innernewcount{newcount} would
  256. % define \innernewcount to be a non-outer version of \newcount.
  257. %
  258. \def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}%
  259. %
  260. % We use \@innerdef to make some of our allocations local, because
  261. % Eplain includes our code inside a conditional.  We put @'s in the
  262. % names to minimize the (already small) chance of conflicts.
  263. %
  264. \@innerdef\@innernewcount{newcount}%
  265. \@innerdef\@innernewdimen{newdimen}%
  266. \@innerdef\@innernewif{newif}%
  267. \@innerdef\@innernewwrite{newwrite}%
  268. %
  269. %
  270. % Swallow one parameter.
  271. %
  272. \def\@gobble#1{}%
  273. %
  274. %
  275. % Use TeX 3.0's \inputlineno to get the line number, for better error
  276. % messages, but if we're using an old version of TeX, don't do anything.
  277. %
  278. \ifx\inputlineno\@undefined
  279.    \let\@linenumber = \empty % Pre-3.0.
  280. \else
  281.    \def\@linenumber{\the\inputlineno:\space}%
  282. \fi
  283. %
  284. %
  285. % The following macro \@futurenonspacelet (from the TeXbook) behaves
  286. % essentially like \futurelet except that it discards any implicit or
  287. % explicit space tokens that intervene before a nonspace is scanned:
  288. %
  289. \def\@futurenonspacelet#1{\def\cs{#1}%
  290.    \afterassignment\@stepone\let\@nexttoken=
  291. }%
  292. \begingroup % The grouping here avoids stepping on an outside use of `\\'.
  293. \def\\{\global\let\@stoken= }%
  294. \\ % now \@stoken is a space token (\\ is a control symbol, so that
  295.    % space after it is seen).
  296. \endgroup
  297. \def\@stepone{\expandafter\futurelet\cs\@steptwo}%
  298. \def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree
  299.    \else\let\@@next=\@nexttoken\fi \@@next}%
  300. \def\@stepthree{\afterassignment\@stepone\let\@@next= }%
  301. %
  302. %
  303. % \@getoptionalarg\CS gets an optional argument from the input, enclosed
  304. % in brackets, then expands \CS.  We set \@optionalarg to \empty if we
  305. % don't find one, otherwise to the text of the argument.  This assumes
  306. % the brackets don't have a funny category code.
  307. %
  308. \def\@getoptionalarg#1{%
  309.    \let\@optionaltemp = #1%
  310.    \let\@optionalnext = \relax
  311.    \@futurenonspacelet\@optionalnext\@bracketcheck
  312. }%
  313. %
  314. % The \expandafter's in this macro let us avoid the use of \aftergroup,
  315. % which is somewhat more expensive.
  316. %
  317. \def\@bracketcheck{%
  318.    \ifx [\@optionalnext
  319.       \expandafter\@@getoptionalarg
  320.    \else
  321.       \let\@optionalarg = \empty
  322.       % We can't do the \temp after the \fi, because then the \temp gets
  323.       % in the way of reading the optional argument from the input, if
  324.       % we do have one.
  325.       \expandafter\@optionaltemp
  326.    \fi
  327. }%
  328. %
  329. \def\@@getoptionalarg[#1]{%
  330.    \def\@optionalarg{#1}%
  331.    \@optionaltemp
  332. }%
  333. %
  334. %
  335. % From LaTeX.
  336. %
  337. \def\@nnil{\@nil}%
  338. \def\@fornoop#1\@@#2#3{}%
  339. %
  340. \def\@for#1:=#2\do#3{%
  341.    \edef\@fortmp{#2}%
  342.    \ifx\@fortmp\empty \else
  343.       \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}%
  344.    \fi
  345. }%
  346. %
  347. \def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
  348.        #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi
  349. }%
  350. %
  351. \def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
  352.        \let\@nextwhile=\@fornoop \else
  353.       #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}%
  354. }%
  355. %
  356. %
  357. % This macro tests if a file \jobname.#1 exists, and sets \if@fileexists
  358. % appropriately.  If an optional argument is given, it is used as the
  359. % root part of the filename instead of \jobname.
  360. %
  361. \@innernewif\if@fileexists
  362. %
  363. \def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}%
  364. \def\@finishtestfileexistence#1{%
  365.    \begingroup
  366.       \def\extension{#1}%
  367.       \immediate\openin0 =
  368.          \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi
  369.          \ifx\extension\empty \else .#1\fi
  370.          \space
  371.       \ifeof 0
  372.          \global\@fileexistsfalse
  373.       \else
  374.          \global\@fileexiststrue
  375.       \fi
  376.       \immediate\closein0
  377.    \endgroup
  378. }%
  379. %
  380. %
  381. %% [[[start of BibTeX-specific stuff]]]
  382. %
  383. % Now come the four main LaTeX commands and their associated .aux
  384. % commands.  Just as in LaTeX, \bibliographystyle defines the BibTeX
  385. % style name (.bst file, that is), and \bibliography defines the
  386. % database (.bib) file(s).  The corresponding .aux-file commands are
  387. % \bibstyle and \bibdata, which are there only for BibTeX's (but not
  388. % LaTeX's) use.
  389. %
  390. \def\bibliographystyle#1{%
  391.    \@readauxfile
  392.    \@writeaux{\string\bibstyle{#1}}%
  393. }%
  394. \let\bibstyle = \@gobble
  395. %
  396. % As well as writing the \bibdata command to tell BibTeX which .bib
  397. % files to read, we read the .bbl file that BibTeX (or a person,
  398. % conceivably) has produced.  We use \bblfilebasename as the root of the
  399. % filename to read; this defaults to \jobname.
  400. %
  401. \let\bblfilebasename = \jobname
  402. \def\bibliography#1{%
  403.    \@readauxfile
  404.    \@writeaux{\string\bibdata{#1}}%
  405.    \@testfileexistence[\bblfilebasename]{bbl}%
  406.    \if@fileexists
  407.       % We just output a non-discardable item (the `whatsit' with the
  408.       % \bibdata command).  This means that the glue that will be
  409.       % inserted next (\parskip or \baselineskip, most likely) will be a
  410.       % legal breakpoint.  Most likely, this is after some kind of
  411.       % heading, where we don't want to allow a page break.  So:
  412.       \nobreak
  413.       \@readbblfile
  414.    \fi
  415. }%
  416. \let\bibdata = \@gobble
  417. %
  418. % The \nocite{label,label,...} command writes its argument to \@auxfile,
  419. % unless instructed not to, but produces no text in the document.  Both
  420. % the \nocite and \cite commands produce \citation commands in the .aux file.
  421. %
  422. \def\nocite#1{%
  423.    \@readauxfile
  424.    \@writeaux{\string\citation{#1}}%
  425. }%
  426. %
  427. \@innernewif\if@notfirstcitation
  428. %
  429. % \cite[note]{label,label,...} produces the citations for the labels as
  430. % well.  If the optional argument `note' is present, it's added after
  431. % the labels.  Since \cite calls \nocite to do its .aux-file writing,
  432. % \cite doesn't need to call \@readauxfile (\nocite does).
  433. %
  434. \def\cite{\@getoptionalarg\@cite}%
  435. %
  436. % Typeset the citations for the labels in #1, followed by the note, if
  437. % it exists.  To change the citation's format in the text, redefine one
  438. % or more `\print...' macros, whose defaults appear later in this file.
  439. %
  440. \def\@cite#1{%
  441.    % Remember the optional argument, in case one of the macros we call
  442.    % below ends up looking for an optional argument itself.  For
  443.    % example, if a \cite[note] triggers reading the .aux file, then the
  444.    % [note] would be clobbered, since \@testfileexistence looks for an
  445.    % optional arg.
  446.    \let\@citenotetext = \@optionalarg
  447.    % Start printing the text, beginning with a left bracket by default.
  448.    \printcitestart
  449.    % It's complicated, but because \nocite puts a `whatsit' onto the list,
  450.    % \nocite should follow \printcitestart.  It's conceivable, but very
  451.    % unlikely, that this `whatsit' will cause a problem (glue that doesn't
  452.    % disappear when you want it to is the most likely symptom), requiring
  453.    % a change either to \printcitestart or to the label that the .bst file
  454.    % produces.
  455.    \nocite{#1}%
  456.    \@notfirstcitationfalse
  457.    \@for \@citation :=#1\do
  458.    {%
  459.       \expandafter\@onecitation\@citation\@@
  460.    }%
  461.    \ifx\empty\@citenotetext\else
  462.       \printcitenote{\@citenotetext}%
  463.    \fi
  464.    \printcitefinish
  465. }%
  466. %
  467. \def\@onecitation#1\@@{%
  468.    \if@notfirstcitation
  469.       \printbetweencitations
  470.    \fi
  471.    %
  472.    \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax
  473.       \if@citewarning
  474.          \message{\@linenumber Undefined citation `#1'.}%
  475.       \fi
  476.       % Give it a dummy definition:
  477.       \expandafter\gdef\csname\@citelabel{#1}\endcsname{%
  478.          {\tt
  479.             \escapechar = -1
  480.             \nobreak\hskip0pt
  481.             \expandafter\string\csname#1\endcsname
  482.             \nobreak\hskip0pt
  483.          }%
  484.       }%
  485.    \fi
  486.    % Now produce the text, whether it was undefined or not.
  487.    \@printcitelabel{#1}%
  488.    \@notfirstcitationtrue
  489. }%
  490. %
  491. % This is in case some macro package wants to redefine \@citelabel to be
  492. % something that is not fully expandable.  Suggested Victor Eijkhout for
  493. % Lollipop.
  494. \def\@printcitelabel#1{%
  495.    \csname\@citelabel{#1}\endcsname
  496. }%
  497. %
  498. % Given a label `foo', the macro `\b@foo' is supposed to
  499. % hold the text that should be produced.
  500. %
  501. \def\@citelabel#1{b@#1}%
  502. %
  503. % So, how does a citation label get defined?  When we read the .bbl file
  504. % (below), a \bibitem writes out a \@citedef command.  And when we read
  505. % the \@citedef, we define \@citelabel{#1}, where #1 is the user's
  506. % label.
  507. %
  508. \def\@citedef#1#2{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}%
  509. %
  510. %
  511. % Reading the .bbl file also produces the typeset bibliography.  Please
  512. % notice, however, that we do not produce the title for the references
  513. % (e.g., `References'), as LaTeX does.  The formatting and spacing of
  514. % that title, whether it should go into the headline, and so on, are all
  515. % things determined by your format.  We cannot know those things in
  516. % advance.  If you wish, you can define \bblhook to produce the title.
  517. % Or just do it before the \bibliography command.
  518. %
  519. \def\@readbblfile{%
  520.    % Define a counter to tell us which item number we are on, unless
  521.    % we've already defined it (because the document has more than one
  522.    % bibliography).
  523.    \ifx\@itemnum\@undefined
  524.       \@innernewcount\@itemnum
  525.    \fi
  526.    %
  527.    \begingroup
  528.       % If another package has already defined \begin, don't define our
  529.       % own simplistic \begin and \end; assume they want to take care of
  530.       % it themselves.  (That way, their \begin's and \end's for other
  531.       % things can be used in the bib files.)
  532.       \ifx\begin\undefined
  533.          \def\begin##1##2{%
  534.             % ##1 is just `thebibliography'.
  535.             % ##2 is the widest label.
  536.             % We set (new dimen) \biblabelwidth based on the widest label
  537.             \setbox0 = \hbox{\biblabelcontents{##2}}%
  538.             \biblabelwidth = \wd0
  539.          }%
  540.          \let\end = \@gobble % The arg is `thebibliography' again.
  541.       \fi
  542.       %
  543.       % Here we have two possibilities:
  544.       % \bibitem[typesetlabel]{citationlabel}
  545.       % \bibitem{citationlabel}
  546.       % If we have the second of these, the citations are numbered, starting
  547.       % from one; we use our own count register \@itemnum for this.
  548.       %
  549.       \@itemnum = 0
  550.       \def\bibitem{\@getoptionalarg\@bibitem}%
  551.       \def\@bibitem{%
  552.          \ifx\@optionalarg\empty
  553.             \expandafter\@numberedbibitem
  554.          \else
  555.             \expandafter\@alphabibitem
  556.          \fi
  557.       }%
  558.       \def\@alphabibitem##1{%
  559.          % Need \xdef here for various reasons.
  560.          \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}%
  561.          % Left-justify alpha labels, unless \biblabel{pre,post}contents
  562.          % are already defined.
  563.          \ifx\biblabelprecontents\@undefined
  564.             \let\biblabelprecontents = \relax
  565.          \fi
  566.          \ifx\biblabelpostcontents\@undefined
  567.             \let\biblabelpostcontents = \hss
  568.          \fi
  569.          \@finishbibitem{##1}%
  570.       }%
  571.       %
  572.       \def\@numberedbibitem##1{%
  573.          \advance\@itemnum by 1
  574.          \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}%
  575.          % Right-justify numeric labels, unless \biblabel{pre,post}contents
  576.          % are already defined.
  577.          \ifx\biblabelprecontents\@undefined
  578.             \let\biblabelprecontents = \hss
  579.          \fi
  580.          \ifx\biblabelpostcontents\@undefined
  581.             \let\biblabelpostcontents = \relax
  582.          \fi
  583.          \@finishbibitem{##1}%
  584.       }%
  585.       %
  586.       \def\@finishbibitem##1{%
  587.          \biblabelprint{\csname\@citelabel{##1}\endcsname}%
  588.          \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
  589.          \ignorespaces
  590.       }%
  591.       %
  592.       % Do the printing (we're producing the bibliography, remember).
  593.       %
  594.       \let\em = \bblem
  595.       \let\newblock = \bblnewblock
  596.       \let\sc = \bblsc
  597.       % Punctuation won't affect spacing;
  598.       \frenchspacing
  599.       % the penalties below are from LaTeX's [article,book,report].sty;
  600.       \clubpenalty = 4000 \widowpenalty = 4000
  601.       % the next two values come from LaTeX's \sloppy command;
  602.       \tolerance = 10000 \hfuzz = .5pt
  603.       \everypar = {\hangindent = \biblabelwidth
  604.                       \advance\hangindent by \biblabelextraspace}%
  605.       \bblrm
  606.       % the \parskip is a guess at what looks good;
  607.       \parskip = 1.5ex plus .5ex minus .5ex
  608.       % and the space between label and text comes from LaTeX's \labelsep.
  609.       \biblabelextraspace = .5em
  610.       \bblhook
  611.       %
  612.       \input \bblfilebasename.bbl
  613.    \endgroup
  614. }%
  615. %
  616. % The widest label's width is useful for redefining \biblabelprint;
  617. % you redefine \biblabelwidth, in effect, by redefining the
  618. % \biblabelcontents macro that appears below.  And \biblabelextraspace,
  619. % which is redefinable inside \bblhook, is added to \biblabelwidth to
  620. % determine the amount of hanging indentation.
  621. %
  622. \@innernewdimen\biblabelwidth
  623. \@innernewdimen\biblabelextraspace
  624. %
  625. % Now come the main macros that are related to the printing of the
  626. % bibliography.  Since you might want to redefine them, they are given
  627. % default definitions outside of \@readbblfile.
  628. %
  629. % The first one controls the printing of a bibliography entry's label.
  630. % If you change it, make sure that it starts with something like
  631. % \noindent or \indent or \leavevmode that puts TeX into horizontal mode
  632. % (even if the label itself is empty); otherwise, the hanging
  633. % indentation will get messed up in certain circumstances.
  634. %
  635. \def\biblabelprint#1{%
  636.    \noindent
  637.    \hbox to \biblabelwidth{%
  638.       \biblabelprecontents
  639.       \biblabelcontents{#1}%
  640.       \biblabelpostcontents
  641.    }%
  642.    \kern\biblabelextraspace
  643. }%
  644. %
  645. % If you are using numeric labels, and you want them left-justified
  646. % (numeric labels by default are right-justified), do something like:
  647. %     \def\biblabelprecontents{\relax}
  648. %     \def\biblabelpostcontents{\hss}
  649. %
  650. % By default the labels are typeset in \bblrm, and enclosed in brackets.
  651. %
  652. \def\biblabelcontents#1{{\bblrm [#1]}}%
  653. %
  654. % The main text, too, is typeset using \bblrm, which is \rm by default.
  655. %
  656. \def\bblrm{\rm}%
  657. %
  658. % Emphasis for producing, e.g., titles, is done with \it by default.
  659. %
  660. \def\bblem{\it}%
  661. %
  662. % Some styles use a caps-and-small-caps font for author names.  LaTeX
  663. % defines an \sc command but plain TeX doesn't, so we need one here.
  664. % The definition below doesn't load the font unless it's needed, but it
  665. % tries to load only the 10pt version, because it might not exist at
  666. % other point sizes.
  667. %
  668. \def\bblsc{\ifx\@scfont\@undefined
  669.               \font\@scfont = cmcsc10
  670.            \fi
  671.            \@scfont
  672. }%
  673. %
  674. % The major parts of an entry are separated with \bblnewblock.  The
  675. % numbers below are taken from LaTeX's `article' style.
  676. %
  677. \def\bblnewblock{\hskip .11em plus .33em minus .07em }%
  678. %
  679. % Here's where you stick any other bibliography-formatting goodies, or
  680. % redefine the values above.
  681. %
  682. \let\bblhook = \empty
  683. %
  684. %
  685. % Here are the four default definitions for formatting the in-text
  686. % citations.  These are what you redefine (after your \input btxmac but
  687. % before your \bibliography) to get parens instead of brackets, or
  688. % superscripts, or footnotes, or whatever.
  689. %
  690. \def\printcitestart{[}%         left bracket
  691. \def\printcitefinish{]}%        right bracket
  692. \def\printbetweencitations{, }% comma, space
  693. \def\printcitenote#1{, #1}%     comma, space, note (if it exists)
  694. %
  695. % That scheme is pretty flexible.  For example you could use
  696. %     \def\printcitestart{\unskip $^\bgroup}
  697. %     \def\printcitefinish{\egroup$}
  698. %     \def\printbetweencitations{,}
  699. %     \def\printcitenote#1{\hbox{\sevenrm\space (#1)}}
  700. %     \font\eighttt = cmtt8
  701. %     \scriptfont\ttfam = \eighttt
  702. % to get superscripted in-text citations.  (The scriptfont stuff
  703. % exists only to print an undefined citation; it's in cmtt8 because
  704. % there is no cmtt7.)  To get something radically different, however,
  705. % you'll have to define your own \cite command.
  706. %
  707. % When we read `\citation' from the .aux file, it means nothing.
  708. %
  709. \let\citation = \@gobble
  710. %
  711. %
  712. % Now comes the stuff for dealing with LaTeX's \newcommand.  As
  713. % mentioned earlier, this \newcommand will redefine a preexisting
  714. % command; that's different from how LaTeX's \newcommand behaves.
  715. %
  716. \@innernewcount\@numparams
  717. %
  718. % \newcommand{\foo}[n]{text} defines the control sequence \foo to have
  719. % n parameters, and replacement text `text'.
  720. %
  721. \def\newcommand#1{%
  722.    \def\@commandname{#1}%
  723.    \@getoptionalarg\@continuenewcommand
  724. }%
  725. %
  726. % Figure out if this definition has parameters.
  727. %
  728. \def\@continuenewcommand{%
  729.    % If no optional argument, we have zero parameters.  Otherwise, we
  730.    % have that many.
  731.    \@numparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
  732.    \@newcommand
  733. }%
  734. %
  735. % \@numparams is how many arguments this command has.  The name of the
  736. % command is \@commandname.  The replacement text for the new macro is #1.
  737. %
  738. \def\@newcommand#1{%
  739.    \def\@startdef{\expandafter\edef\@commandname}%
  740.    \ifnum\@numparams=0
  741.       \let\@paramdef = \empty
  742.    \else
  743.       \ifnum\@numparams>9
  744.          \errmessage{\the\@numparams\space is too many parameters}%
  745.       \else
  746.          \ifnum\@numparams<0
  747.             \errmessage{\the\@numparams\space is too few parameters}%
  748.          \else
  749.             \edef\@paramdef{%
  750.                % This is disgusting, but \loop doesn't work inside \edef,
  751.                % because \body isn't defined.
  752.                \ifcase\@numparams
  753.                   \empty  No arguments.
  754.                \or ####1%
  755.                \or ####1####2%
  756.                \or ####1####2####3%
  757.                \or ####1####2####3####4%
  758.                \or ####1####2####3####4####5%
  759.                \or ####1####2####3####4####5####6%
  760.                \or ####1####2####3####4####5####6####7%
  761.                \or ####1####2####3####4####5####6####7####8%
  762.                \or ####1####2####3####4####5####6####7####8####9%
  763.                \fi
  764.             }%
  765.          \fi
  766.       \fi
  767.    \fi
  768.    \expandafter\@startdef\@paramdef{#1}%
  769. }%
  770. %
  771. %% [[[end of BibTeX-specific stuff]]]
  772. %
  773. %
  774. % Names of references (arguments given in the \cite and \nocite
  775. % commands) and file names (arguments given in the \bibliography and
  776. % \bibliographystyle commands) are recorded in \jobname.aux, called the
  777. % \@auxfile in these macros.  Here's how they get read in.
  778. %
  779. \def\@readauxfile{%
  780.    \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined
  781.       \global\@auxfiledonetrue
  782.       \@testfileexistence{aux}%
  783.       \if@fileexists
  784.          \begingroup
  785.             % Because we might be in horizontal mode when \@readauxfile
  786.             % is called (if it's in response to a \cite or \nocite), we
  787.             % want to ignore all the would-be spaces at the ends of
  788.             % lines in the aux file.  Fortunately, it's highly unlikely
  789.             % an end-of-line might actually be desired.
  790.             % And because we don't change the category code of anything
  791.             % but @, primitives like \gdef can't be used to define labels
  792.             % in the aux file.  The solution adopted by btxmac.tex is to
  793.             % write `\@citedef{LABEL}{DEFINITION}' to the aux file, and
  794.             % use \csname on LABEL.
  795.             \endlinechar = -1
  796.             \catcode`@ = 11
  797.             \input \jobname.aux
  798.          \endgroup
  799.       \else
  800.          \message{\@undefinedmessage}%
  801.          \global\@citewarningfalse
  802.       \fi
  803.       \immediate\openout\@auxfile = \jobname.aux
  804.    \fi
  805. }%
  806. %
  807. % The \@readauxfile macro does all that work the first time it's called.
  808. % Since it's called once for every \cite, \nocite, \bibliography, and
  809. % \bibliographystyle command that the user issues, we need to remember
  810. % whether the work's been done.  It's considered done if we're not to do
  811. % it---that is, if \noauxfile is defined.
  812. %
  813. \newif\if@auxfiledone
  814. \ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi
  815. %
  816. % It's conceivable you'd want to change how other characters are read;
  817. % to do that, change their category code before doing \input btxmac.
  818. %
  819. %
  820. % After reading the .aux file, \@readauxfile opens it for writing.
  821. % The \@writeaux macro does the actual writing (as long as
  822. % \noauxfile is undefined).
  823. %
  824. \@innernewwrite\@auxfile
  825. \def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}%
  826. %
  827. %
  828. % A macro package that uses btxmac.tex might define
  829. % \@undefinedmessage (before doing an \input btxmac).
  830. %
  831. \ifx\@undefinedmessage\@undefined
  832.    \def\@undefinedmessage{No .aux file; I won't give you warnings about
  833.                           undefined citations.}%
  834. \fi
  835. %
  836. % Even if citations are undefined, we want to complain only if
  837. % \@citewarningtrue.  The default is to set \@citewarningtrue unless
  838. % \noauxfile is defined.  Again, a macro package that uses
  839. % btxmac.tex might want to redefine this.
  840. %
  841. \@innernewif\if@citewarning
  842. \ifx\noauxfile\@undefined \@citewarningtrue\fi
  843. %
  844. %
  845. % Finally, before leaving we restore @'s old category code.
  846. %
  847. \catcode`@ = \@oldatcatcode
  848.